package Polymorphism;
/*
* 多态
* 1.具体去完成某个任务是，不同的对象取完成会产生不同的状态
*
* 多态的条件
* 1.必须在继承体系中
* 2.子类必须对父类中的方法进行重写
* 3.通过父类的引用调用重写的方法
*
*
*
* 向上转型
* 1.把子类给父类
* */

/*
* 多态
* 1.发生向上转型
* 2.完成方法的重写
* 3.通过父类的引用 调用重写的方法
* */
class Animal {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Animal{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public void eat() {
        System.out.println(getName() + "干饭！");
    }
}

class Dog extends Animal {

    public Dog(String name, int age) {
        super(name, age);
    }
    public void bark() {
        System.out.println(getName() + "狗叫！");
    }
}

class Bird extends Animal {

    public Bird(String name, int age) {
        super(name, age);
    }
    public void fly() {
        System.out.println(getName() + "飞飞飞！");
    }
    public void eat() {
        System.out.println(getName() + "吃虫子！");
    }
}



public class Test4 {

    public static void main(String[] args) {
        Animal animal = new Bird("鹦鹉",1);
        if(animal instanceof Bird) {
            Bird bird = (Bird) animal;//向下转型
            bird.fly();
        }
    }
    public static void main2(String[] args) {
        /*Bird bird = new Bird("乌鸦",2);
        Animal animal = bird;//形成一个向上转型*/
        Animal animal = new Bird("乌鸦",2);//向上转型  父类的引用 引用的子类的对象

        animal.eat();//动态绑定
        /*
        * 实现了方法的重写
        * 1.方法名相同
        * 2.参数列表相同【类型，个数，顺序】
        * 3.返回值相同  子类的返回可以和父类的返回值是父子类关系（协变类型）
        * 4.static修饰的方法不能被重写
        * 5.private修饰的方法不能被重写
        * 6.子类的访问修饰符需大于父类的访问修饰符
        * */
    }
}
